/**
 * Created by shenc on 2015/12/26.
 */

//动态更新html

function AjaxForm(jqP,options){
    var def={
        delUrl:'',
        editUrl:'',
        editCb:function(){},
        delCb:function(){},
        hideOnEdit:true
    };
    this.jqP=jqP;
    this.opts= $.extend(true,def,options||{});

    this.init();
}

(function(c,p){
    p.options={};
    p.init=function(){

        var jqP=this.jqP;
        p.options=this.opts;

        jqP.each(function(){
            var that=$(this);

            if(c.getInstance(that)) return false;
            p.options.jqForm=that;
            p.options.ajaxForm=that.find('.ajax-form');
            p.options.ajaxInfoGroup=that.find('.ajax-info-group');
            p.options.addMoreWrap=that.find('.ajax-add-more');

            p.bind();

            //表单验证
            if(typeof $.validator == 'function'){
                that.validate({
                    submitHandler:function(form){
                        p._event._ok();
                    }
                });
            }else{
                that.on('submit',function(e){
                    e.preventDefault();
                    p._event._ok();
                });
            }
            c.setInstance(that,p);
        });

    };

    p.bind=function(){
        var opts= p.options,
            jqForm=opts.jqForm;

        jqForm.on('click','.js-edit',function(){
            opts.curEvent='edit';

            p._event._edit($(this));
        });

        jqForm.on('click','.js-del',function(){
            opts.curEvent='del';

            p._event._del($(this));
        });

        jqForm.on('click','.js-addMore',function(){
            opts.curEvent='add';

            p._event._add();
        });



        jqForm.on('click','.btn-cancel',function(){
            p._event._cancel();
        });
    };

    p._event={

        //添加按钮事件
        _add:function(){
            var opts= p.options;
            opts.jqForm.append(opts.ajaxForm);

            opts.ajaxForm.show();
            opts.addMoreWrap.hide();
        },

        //修改按钮事件
        _edit:function($this){
            var opts= p.options;
            opts.curInfoGroup=$this.closest('.bl-form-group');

            var infoData=p.getInfoData(opts.curInfoGroup);
            p.setFormData(infoData);
            opts.curInfoGroup.after(opts.ajaxForm);

            opts.ajaxForm.show();
            if(opts.hideOnEdit){
                opts.ajaxInfoGroup.find('.bl-form-group').show();//显示所有的
                opts.curInfoGroup.hide();
            }
            opts.addMoreWrap.hide();

        },

        //删除按钮事件
        _del:function($this){
            var opts= p.options;
            opts.curInfoGroup=$this.closest('.bl-form-group');

            var curLayer=layer.confirm('确定要删除吗？',function(){
                $.ajax({
                    url:opts.delUrl+'/'+opts.curInfoGroup.data('id'),
                    type:opts.delType||'post',
                    dataType:'json',
                    data:{id:opts.curInfoGroup.data('id')},
                    success:function(res){
                        opts.curInfoGroup.slideUp(200,function(){
                            $(this).remove();
                        });
                        if(typeof opts.delCb=='function'){
                            opts.delCb(res,opts);
                        }
                        layer.close(curLayer);
                    }
                });
            });

        },

        //确定按钮事件
        _ok:function(){
            var opts= p.options;

            opts.curInfoGroup=opts.curInfoGroup||opts.ajaxInfoGroup.find('.bl-form-group');

            var formData= p.getFormData();
            var url=opts.curEvent=='add'?opts.addUrl:(opts.editUrl+'/'+opts.curInfoGroup.data('id')),
                type=opts.curEvent=='add'?(opts.addType||'post'):(opts.editType||'post');

            $.ajax({
                url:url,
                type:type,
                dataType:'json',
                data:formData,
                success:function(res){
                    var html;

                    //402 停止执行
                    if(res.status == 402){
                        return false;
                    }

                    if(opts.curEvent=='add'){
                        html= opts.ajaxInfoGroup.find('.js-tpl');

                        //判断html是否是已存在的数据展示
                        html=html.clone(true);

                        html.addClass('bl-form-group').removeClass('js-tpl');
                        opts.ajaxInfoGroup.append(html);
                        opts.curInfoGroup=html;
                    }

                    if(res.address_id){
                        opts.curInfoGroup.data('id',res.address_id);
                    }



                    p.setInfoData(formData);

                    opts.jqForm[0].reset();
                    opts.ajaxForm.hide();
                    opts.addMoreWrap.show();
                    opts.curInfoGroup.show();
                    if(typeof opts.editCb=='function'){
                        opts.editCb(formData,opts);
                    }

                }
            })


        },

        //取消按钮事件
        _cancel:function(){
            var opts= p.options;
            opts.jqForm[0].reset();
            opts.ajaxForm.hide();
            opts.addMoreWrap.show();
            if(typeof opts.curInfoGroup != 'undefined'){
                opts.curInfoGroup.show();
            }
        }
    };

    p.getInfoData=function(curInfoGroup){
        var resData={};

        var infoItems=curInfoGroup.find('[data-name]');

        for(var i=0;i<infoItems.length;i++){
            var curItem=infoItems.eq(i);
            var itemName=curItem.data('name');

            resData[itemName]=typeof curItem.data('value') == 'undefined'?curItem.text():curItem.data('value');
        }

        return resData;
    };
    p.setInfoData=function(data){
        var curInfoGroup= p.options.curInfoGroup;
        //赋值
        for(var i in data){
            if(data.hasOwnProperty(i)) {
                var curItem=curInfoGroup.find('[data-name="'+i+'"]');

                if(curItem.length==0) continue;
                if(data[i].text){
                    curItem.data('value',data[i].value).text(data[i].text);
                }else{
                    curItem.data('value',data[i]).text(data[i]);
                }
            }
        }
    };

    p.getFormData=function(){
        var opts= p.options;
        var inputs=opts.ajaxForm.find(':input[name]');
        var formData={};
        for(var i=0;i<inputs.length;i++){
            var curInput=inputs.eq(i),
                 name=curInput.attr('name');

            if(curInput.attr('type')=='checkbox'){
                formData[name]=curInput.prop('checked')?1:0;
                continue;
            }

            if(curInput.attr('type')=='radio'&&!curInput.prop('checked')){
                continue;
            }

            /*if(curInput.hasClass('js-areaInput')){
                formData[name]={
                    value:curInput.val(),
                    text:curInput.data('text')
                };
                continue;
            }*/
            formData[name]=curInput.val();
        }

        return formData;
    };
    p.setFormData=function(data){
        var opts= p.options;
        var ajaxForm=opts.ajaxForm;

        if($.isEmptyObject(data)) return false;

        //赋值
        for(var i in data){
            if(data.hasOwnProperty(i)) {
                var curInput=ajaxForm.find('[name="'+i+'"]');

                if(curInput.attr('type')=='checkbox'){
                    curInput.prop('checked',data[i]!=0);
                    continue;
                }

                if(curInput.attr('type')=='radio'&&curInput.val()==data[i]){
                    curInput.prop('checked',true);
                    continue;
                }

                /*if(curInput.hasClass('js-areaInput')){
                    curInput.val(data[i].value).data('text',data[i].text);
                    curInput.trigger('input');//触发input事件
                    continue;
                }*/

                curInput.val(data[i]).trigger('input');
            }
        }
    };

    c.getInstance=function(jqObj){
        return jqObj.data('AjaxFormInstance');
    };
    c.setInstance=function(jqObj,instance){
        jqObj.data('AjaxFormInstance',instance);
    };

})(AjaxForm,AjaxForm.prototype);

